const { execSql } = require("../utils/db");

class order {
    /**
     * 创建订单
     * @description 当时订单这块 在创建订单的时候 需要创建的数据 比较多  比如 订单号的生成 用户id 订单备注 支付时间 创建订单时间 订单状态（未支付 已支付 已评价 已发货 已完成 已退款 已删除 已取消。。）  
     * 注意：创建 订单 
     * 触发时机：当用户在购物车页面 点击结算 或者在商品详情页面 点击立即购买 会调用这个方法 
     * 这个方法只是用来初始化订单的 
     * 也是说只负责创建一个 未支付的订单
     * 如果需要支付的订单 还需在前端 点击立即支付 付款成功后 通过一部 notify方法在修改订单状态
     */
    static async addOrder(obj) {
        let res = await execSql(`INSERT INTO lv_order (order_no, user_id, pay_type, distribution, status, pay_status, distribution_status, accept_name, longitude, latitude, address, mobile, payable_amount, real_amount, payable_freight, real_freight, pay_time, send_time, create_time, completion_time, invoice, note, invoice_info, order_amount, accept_time, trade_no, active_id, is_checkout, spend_point, _hash) VALUES ('${obj.order_no}', '${obj.user_id}', '1', '1', '1', '0', '0', '', '', '', '', '', '${obj.payable_amount}', '${obj.real_amount}', '0', '0', '${obj.nowTime}', '${obj.nowTime}', '${obj.nowTime}', '${obj.nowTime}', '0',  '',  '',  '${obj.order_amount}', '', '', '0', '0', '0', '0')`)
        return res
    }
    /**
     * 创建订单商品 
     * @param {*} obj 
     * @returns 
     * 触发时机：当用户创建订单完成后立即触发这个方法 主要负责 将购物车结算的数据 迁移到这个表中来 并且需要和订单表有一个关联
     */
    static async createOrderGoods(obj) {
        let res = await execSql(`INSERT INTO lv_order_goods (orderid, goodsid, uid, goodsname, img, price, num, type, temp_key, skuid, skuname) VALUES ('${obj.orderid}', '${obj.goodsid}', '${obj.uid}', '${obj.goodsname}', '${obj.img}', '${obj.price}', '${obj.num}', '${obj.type}', '${obj.temp_key}', '${obj.skuid}', '${obj.skuname}')`)
        return res/*  */
    }
    /**
     * 删除订单
     * @param {*} id 
     * @returns 
     * 对于前端来说 只是点击了删除 那么这个方法 代表 假删除 也就是修改了订单的删除状态 同时 必须是已完成的订单才允许用进行操作
     */
    static async delOrder(id) {
        // status = 5 代表 已完成 if_del 0 代表未删除  1 代表已删除
        let res = await execSql(`update set if_del=1 where id=${id} and status=5`)
        return res
    }

    // static async editFlag(id,status){

    // }
    /**
     * 获取订单
     * @param {*} uid 
     * @param {*} page 
     * @returns
     *  
     */
    static async getOrder(uid,status=null, page = 1) {
        let where = ""
        if(status===1){
            where = ` and pay_status=0 `
        }else if(status===2){
             where = ` and pay_status=1 and status=2 `
        }else if(status===3){
             where = ` and status=5 `
        }else if(status===4){
             where = ` and status in (6,7) `
        }
        // 计算分页 的起始位置
        let start = (page - 1) * 20
        // 首先 pay_time 代表 支付时间 这块做了一个倒叙排序 根据支付时间进行排序的 分页是每页20调数据 先根据用户id查询订单表获取前20条数据 
        let res = await execSql(`select * from lv_order where user_id=${uid} and if_del=0 ${where} order by pay_time desc limit ${start},20`)
        //在循环 订单商品表 将20条数据的关联商品查询出来 
        for (var i = 0; i < res.length; i++) {
            // 直接将查询出来的订单商品 放到 订单列表中的goodsList属性中
            res[i].goodsList = await execSql(`select * from lv_order_goods where orderid=${res[i].id}`)
        }
        // 计算这个用户的 总的数据条数 
        let pageCount = await execSql(`select count(*) as sums from lv_order where user_id=${uid} and if_del=0 ${where}`)
        // 如果用户没有订单 总页码默认为1
        if (pageCount.length > 0) {
            // 计算总页码  = 总的数据条 ÷ 每页显示条数 在向上取整
            pageCount = Math.ceil(pageCount[0].sums / 20)
        } else {
            pageCount = 1
        }
        return { list: res, pageCount }
    }

    static async getSnOrder(order_no) {

        // 首先 pay_time 代表 支付时间 这块做了一个倒叙排序 根据支付时间进行排序的 分页是每页20调数据 先根据用户id查询订单表获取前20条数据 
        let res = await execSql(`select * from lv_order where order_no="${order_no}"`)
        if (res.length > 0) {
            // 直接将查询出来的订单商品 放到 订单列表中的goodsList属性中
            res[0].goodsList = await execSql(`select * from lv_order_goods where orderid=${res[0].id}`)
            return res
        }else{
            return false
        }

    }
}
module.exports = order